package models

import (
	"context"
	"encoding/json"
	"fmt"
	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
	"log"
)

// 第二套通用的操作
// 插入数据
func ConnectToMongoDBV2(host string, port string, dbname string, collection string) (*mongo.Collection, error) {
	pathUrl := "mongodb://" + host + ":" + port
	// 创建客户端
	client, err := mongo.NewClient(options.Client().ApplyURI(pathUrl))
	if err != nil {
		return nil, fmt.Errorf("创建客户端失败: %s", err)
	}
	// 连接到 MongoDB
	err = client.Connect(context.TODO())
	if err != nil {
		return nil, fmt.Errorf("连接错误: %s", err)
	}
	// 选择数据库和集合
	Database := client.Database(dbname)
	Collection := Database.Collection(collection)
	return Collection, nil
}

func InsertPersonV2(collection *mongo.Collection, jsonData string) error {

	var dataStore interface{}
	err := json.Unmarshal([]byte(jsonData), &dataStore)
	if err != nil {
		log.Fatal("解析 JSON 失败:", err)
	}

	_, err = collection.InsertOne(context.TODO(), dataStore)
	if err != nil {
		return fmt.Errorf("插入数据失败: %s", err)
	}
	return nil
}

// 根据自定义语句查询数据
func FindWithSelect02(collection *mongo.Collection, selectFields bson.M, filters ...bson.M) ([]interface{}, error) {
	// 创建 FindOptions 对象
	findOptions := options.Find()
	//设置投影字段，按照字段进行查找
	findOptions.SetProjection(selectFields)

	//判断有无筛选条件
	var filter bson.M
	if len(filters) > 0 {
		filter = filters[0]
	} else {
		filter = bson.M{}
	}

	// 使用指定的筛选条件和字段执行查询
	cursor, err := collection.Find(context.TODO(), filter, findOptions)
	if err != nil {
		return nil, fmt.Errorf("查询数据失败: %s", err)
	}
	//延迟游标关闭时间，避免资源浪费
	defer cursor.Close(context.TODO())

	// 遍历查询结果并解码为 JSON 数据
	var results []interface{}
	for cursor.Next(context.TODO()) {
		var jsonData interface{}
		err := cursor.Decode(&jsonData)
		if err != nil {
			return nil, fmt.Errorf("解码数据失败: %s", err)
		}
		results = append(results, jsonData)
	}

	// 检查游标是否有错误
	if err := cursor.Err(); err != nil {
		return nil, fmt.Errorf("游标错误: %s", err)
	}

	return results, nil
}

// 更新数据库信息
func UpdateDataV2(collection *mongo.Collection, filterKey string, filterValue string, updateKey string, updateValue string) error {
	Filter := bson.M{filterKey: filterValue}
	Update := bson.M{"$set": bson.M{updateKey: updateValue}}
	_, err := collection.UpdateOne(context.TODO(), Filter, Update)
	if err != nil {
		return fmt.Errorf("更新数据失败: %s", err)
	}
	return nil
}

// 删除数据
func DeleteDataV2(collection *mongo.Collection, filterKey string, filterValue string) error {
	filter := bson.M{filterKey: filterValue}

	_, err := collection.DeleteOne(context.TODO(), filter)
	if err != nil {
		return fmt.Errorf("删除数据失败: %s", err)
	}
	return nil
}
